iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
DevOps

一步步學DevOps:30天入門計劃系列 第 13

Day 13 Shell Script 基礎介紹-2

  • 分享至 

  • xImage
  •  

在Shell Script中常用的字串和數字比較運算符:

字串比較運算符:

=:等於(字串相等)
!=:不等於(字串不相等)
<:小於(按字典序比較)
>:大於(按字典序比較)
-z:檢查字串是否為空(長度為零)
-n:檢查字串是否非空(長度大於零)

數字比較運算符:

-eq:等於(數字相等)
-ne:不等於(數字不相等)
-lt:小於(數字小於)
-le:小於或等於(數字小於或等於)
-gt:大於(數字大於)
-ge:大於或等於(數字大於或等於)

範例:檢查文件的行數是否大於特定數量。

#!/bin/bash 

filename ="test.txt"
最小行數=10

#使用wc指令獲取文件的行數
行數=$(wc -l < "$filename")

#使用if條件句檢查行數是否大於最小行數
if [ $行數 -gt $最小行數 ]; then
    echo "$filename 的行數 ($行數 行) 大於 $最小行數 行"
else
    echo "$filename 的行數 ($行數 行) 小於 $最小行數 行"
fi 

文件測試運算符

在 Shell script中可以使用文件測試運算符(File Test Operators),用於檢查文件的不同屬性和狀態。

-e FILE:如果 FILE 存在,則為真。
-f FILE:如果 FILE 存在且為一個檔案,則為真。
-d FILE:如果 FILE 存在且為一個目錄,則為真。
-s FILE:如果 FILE 存在且檔案大小不為零,則為真。
-r FILE:如果 FILE 存在且可讀取(有讀取權限),則為真。
-w FILE:如果 FILE 存在且可寫入(有寫入權限),則為真。
-x FILE:如果 FILE 存在且可執行(有執行權限),則為真。
-L FILE:如果 FILE 存在且為一個符號連結(軟連結),則為真。
-p FILE:如果 FILE 存在且為一個命名管道(FIFO),則為真。
-c FILE:如果 FILE 存在且為一個字元特殊文件,則為真。

範例:

  • 檢查文件是否存在
if [ -e 文件名 ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi
  • 檢查文件是否為檔案
if [ -f 文件名 ]; then
    echo "文件是一個檔案"
else
    echo "文件不是一個檔案"
fi
  • 檢查文件是否為目錄
if [ -d 目錄名 ]; then
    echo "文件是一個目錄"
else
    echo "文件不是一個目錄"
fi

流程控制

在Shell script中使用條件語句,可以根據不同的條件執行不同的命令。常見的條件語句結構「if else」、「if … elif … fi」和「case」。以下是這三種流程控制結構的介紹:

條件語句 if else:

首先判斷「if」後的條件,如果條件為true,則執行「then」和「else」之間的命令。如果條件為false,則執行「else」後的命令,用if為條件語句開頭,fi為條件語句結尾。

if 條件
then
    # 如果條件為True,執行這裡的命令
else
    # 如果條件為False,執行這裡的命令
fi

範例:檢查變數x是否等於10

x=10
if [ "$x" -eq 10 ]
then
    echo "x等於10"
else
    echo "x不等於10"
fi

條件語句if … elif … fi:

首先評估「if」後的條件1。如果條件1為true,則執行相應的命令,如果條件1為false,則繼續評估「elif」後的條件2,以此類推。如果所有條件都為false,則執行「else」後的命令。

if 條件1
then
    # 如果條件1為真,執行這裡的命令
elif 條件2
then
    # 如果條件2為真,執行這裡的命令
else
    # 如果以上所有條件都不滿足,執行這裡的命令
fi

範例:根據不同的分數顯示不同的評級:

score=85
if [ "$score" -ge 90 ]
then
    echo "評級:A"
elif [ "$score" -ge 80 ]
then
    echo "評級:B"
elif [ "$score" -ge 70 ]
then
    echo "評級:C"
else
    echo "評級:不及格"
fi

條件語句case

case 語句用於執行多重選擇的命令,根據匹配的條件執行相應的命令。基本的 case 語法結構如下:

case 值 in
  條件1)
      條件1匹配時執行的命令
    ;;
  條件2)
     條件2匹配時執行的命令
    ;;
  *)
     沒有任何匹配時執行的命令
    ;;
esac

範例:檢查用戶輸入的文件名稱,然後使用case語句檢查不同的選項。每個選項對應不同的執行命令。

#!/bin/bash
 #提示用戶輸入文件名
echo "請輸入文件名:"
read filename
 #使用case語句檢查文件狀態
case "$filename" in
    -e)
        if [ -e "$1" ]; then
            echo "文件存在。"
        else
            echo "文件不存在。"
            fi
        ;;
    -d)
        if [ -d "$1" ]; then
            echo "這是一個目錄。"
        else
            echo "這不是一個目錄。"
        fi
        ;;
    -r)
        if [ -r "$1" ]; then
            echo "文件可讀。"
        else
            echo "文件不可讀。"
        fi
        ;;
    -w)
        if [ -w "$1" ]; then
            echo "文件可寫。"
        else
            echo "文件不可寫。"
        fi
        ;;
    -x)
        if [ -x "$1" ]; then
            echo "文件可執行。"
        else
            echo "文件不可執行。"
        fi
        ;;
    *)
        echo "請輸入有效的選項:"
        echo "-e 檢查文件是否存在"
        echo "-d 檢查是否為目錄"
        echo "-r 檢查文件是否可讀"
        echo "-w 檢查文件是否可寫"
        echo "-x 檢查文件是否可執行"
        ;;
esac
 

Shellscript中的迴圈是一種常用的控制結構,可以重複執行一段程式碼,直到滿足某個條件為止,或者只是按照指定的次數重複執行。無論是for還是while迴圈,都需要在程式中有終止條件來控制迴圈,以免變成無限迴圈。常見的迴圈有for迴圈和while迴圈,以下是for和while迴圈的結構和範例:

for迴圈

for 迴圈用於遍歷一個列表或一個範圍,對列表中的每個元素執行相同的命令。基本語法如下:

for 變數 in 列表; do
   執行的命令
done

範例:使用for迴圈印出簡單的三角形範例,使用兩個巢狀的for迴圈,外部的迴圈控制行數,內部的迴圈控制每行中星號的數量。每當內部的迴圈執行完畢後,我們在最後加上一個echo指令,以換行,這樣就會在每行的末尾創建一個新行,形成三角形的形狀。

#!/bin/bash

for ((i=1; i<=5; i++))
do
    for ((j=1; j<=i; j++))
    do
        echo -n "*"
    done
    echo   # 換行
done

輸出結果:

*
**
***
****
*****

while 迴圈

while迴圈會在條件為真時一直執行指定的程式碼塊,直到條件變為假為止。可用於處理需要重複執行,但不知道具體次數的情況。

while 條件
do
    # 當條件為真時執行的程式碼
done

範例:while迴圈計算1到5的總和:

#!/bin/bash
sum=0
i=1
while [ $i -le 5 ]
do
    sum=$((sum + i))
    i=$((i + 1))
done
echo "總和: $sum"

函式(Function)結構

函式結構包括函式名稱、函式的程式碼和可選的返回值。函式內部的程式碼可以使用參數來接收傳遞給函式的值,並且可以執行各種操作。

function 函式名稱 {
    # 函式的程式碼
    # 可以使用傳遞給函式的參數
    # 函式的操作
    # ...
    # 返回值(可選)
}

如何使用函式來建立一個簡單的CI/CD(持續集成/持續交付)程式的範例,該程式可以自動構建和部署一個網站應用程序。實際的CI/CD環境中,可以根據需要擴展這些函式,並將其結合到CI/CD工具(如Jenkins、Gitlab、GitHub Actions等)中以自動執行。

#!/bin/bash

# 函式:構建應用程序
build_app() {
    echo "開始構建應用程序..."
    # 在此處執行構建命令,例如使用npm、docker build等
    # 構建完成後將應用程序的檔案放在指定目錄中
    echo "應用程序構建完成"
}

# 函式:測試應用程序
test_app() {
    echo "開始測試應用程序..."
    # 在此處執行測試命令,例如使用Jest、Mocha、Selenium等
    # 檢查測試結果,如果測試失敗,可以中止部署
    echo "測試完成,一切正常"
}
# 函式:部署應用程序
deploy_app() {
    echo "開始部署應用程序..."
    # 在此處執行部署命令,例如使用rsync、scp、Docker Compose等
    # 部署完成後,應用程序將在目標伺服器上運行
    echo "應用程序部署完成"
}

# 主程式
echo "CI/CD流程開始"

# 呼叫函式依次執行CI/CD步驟
build_app
test_app
deploy_app

echo "CI/CD流程完成"

上一篇
Day 12 Shell Script 基礎介紹-1
下一篇
Day 14 Container容器介紹
系列文
一步步學DevOps:30天入門計劃30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言